NO.41 缺失的第一个正数 困难
思路一:两次遍历 第一次遍历将每个元素交换到其元素值对应的下标出,第二次遍历检查每个元素的值和其下标是否相等,如不相等则这个下标就是缺失的第一个正数。
- 第一次遍历:
- 将所有符合
nums[i]大于0且小于length
的元素交换到其值对应的下标位置,例如2应当交换到nums[2]的位置、6应当交换到nums[6]的位置。 - 如果
nums[i]==nums[nums[i]]
则不需要移动,例如nums[0]==3但是nums[3]==3就不需要移动了。 - 交换之后再检查nums[i]是否依然需要交换,如果需要交换继续交换,直至nums[i]无需交换再继续向后遍历。
- 将所有符合
- 第二次遍历:
- 从1开始,如果
nums[i]!=i
则i就是缺失的第一个正数。
- 从1开始,如果
- 两次遍历结束后:
- 如果没有找到缺失的第一个正数,就检查
nums[0]==length
如果相等则返回length+1,否则返回length
- 如果没有找到缺失的第一个正数,就检查
1 | public int firstMissingPositive(int[] nums) { |
时间复杂度:O(n) 这道题所用的方法比较简单,重点要学习其中的抽屉思想。
本人菜鸟,有错误请告知,感激不尽!